package top.hymsk.ecommerce.dao.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import top.hymsk.ecommerce.anno.RedisCache;
import top.hymsk.ecommerce.pojo.DTO.StoreInfoDTO;
import top.hymsk.ecommerce.pojo.PO.mysql.UserPO;

import java.util.List;

/**
 * @author 花于陌上开
 */
@Mapper
@Repository
public interface UserMapper {
    /**
     * 用户是否存在
     *
     * @param username    用户名|null
     * @param phoneNumber 手机号|null
     * @param email       邮箱|null
     * @return 存在(1)/不存在(0)
     */
    @RedisCache
    Integer isUserExist(@Param("username") String username, @Param("phoneNumber") String phoneNumber, @Param("email") String email);

    /**
     * 使用手机号注册
     *
     * @param username    用户名
     * @param password    用户密码
     * @param phoneNumber 用户电话号码
     * @return 注册成功(1)/失败(0)
     */
    Integer registerByPhoneNumber(@Param("username") String username, @Param("password") String password, @Param("phoneNumber") String phoneNumber);

    /**
     * 使用邮箱注册
     *
     * @param username 用户名
     * @param password 用户密码
     * @param email    用户邮箱
     * @return 注册成功(1)/失败(0)
     */
    Integer registerByEmail(@Param("username") String username, @Param("password") String password, @Param("email") String email);

    /**
     * 查询用户(根据用户名)
     *
     * @param username 用户名
     * @return 用户对象
     */
    UserPO selectUserByName(@Param("username") String username);

    /**
     * 查询用户(根据手机号)
     *
     * @param phoneNumber 手机号
     * @return 用户对象
     */
    UserPO selectUserByPhoneNumber(@Param("phoneNumber") String phoneNumber);

    /**
     * 查询数据库中密码(根据邮箱)
     *
     * @param email 邮箱
     * @return 用户对象
     */
    UserPO selectByEmail(@Param("email") String email);

    /**
     * 使用手机号重置密码
     *
     * @param phoneNumber 手机号
     * @param password    密码
     * @return 重置成功(1)/失败(0)
     */
    Integer updatePasswordByPhoneNumber(@Param("phoneNumber") String phoneNumber, @Param("password") String password);

    /**
     * 使用邮箱重置密码
     *
     * @param email    邮箱
     * @param password 密码
     * @return 重置成功(1)/失败(0)
     */
    Integer updatePasswordByEmail(@Param("email") String email, @Param("password") String password);

    /**
     * 查询用户管理店铺
     *
     * @param userId 用户id
     * @return 店铺id
     */
    Integer getStoreIdByUserId(@Param("userId") int userId);

    Integer insertNewStore(@Param("userId") int userId, @Param("storeName") String storeName);

    Integer ifStoreInfoRepetition(@Param("userId") int userId, @Param("storeName") String storeName);

    @RedisCache
    StoreInfoDTO getStoreInfo(@Param("userId") Integer userId, @Param("storeId") Integer storeId);

    /**
     * 查询用户(根据用户ID)
     *
     * @param userId 用户ID
     * @return 用户对象
     */
    @RedisCache
    UserPO selectUserById(@Param("userId") Integer userId);

    List<UserPO> getUserList();

    void deleteUser(@Param("userId") int userId);

}
